gusucode.com > VC++ 仿QQ2006界面 > VC++ 仿QQ2006界面/gusucode/SkinBtn.cpp

    //Download by http://www.NewXing.com
/************************************************************************ 
* 文件名:    SkinBtn.cpp 
* 文件描述:  图片按钮 
* 创建人:    黄锐坤(Nuk), 2006年08月22日
* 版本号:    1.0 
************************************************************************/ 
// SkinBtn.cpp : 实现文件
//

#include "stdafx.h"
#include "NUK.h"
#include "SkinBtn.h"


// CSkinBtn

IMPLEMENT_DYNAMIC(CSkinBtn, CButton)

CSkinBtn::CSkinBtn()
{
	m_state = NORMAL;
	m_pFont=new CFont();
	m_pFont->CreatePointFont(90,_T("Arial"));
	m_fg = RGB(0, 0, 0);
	m_bg = RGB(255, 255, 255);
	m_bMouseOver = false;
	m_bEnabled = true;
	m_bDCStored = false;
	m_textPos = CPoint(21,0);
	m_iconRect = CRect(0,0,16,16);
}

CSkinBtn::~CSkinBtn()
{
	delete m_pFont;
	m_memDC.DeleteDC();
}


BEGIN_MESSAGE_MAP(CSkinBtn, CButton)
	ON_WM_MOUSEMOVE()
	ON_WM_TIMER()
	ON_WM_ERASEBKGND()
	ON_WM_SETCURSOR()
	ON_WM_ENABLE()
END_MESSAGE_MAP()

void CSkinBtn::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{

	//// TODO:  添加您的代码以绘制指定项
	//CDC* pDC = CDC::FromHandle(lpDIS->hDC);
	UINT state = lpDIS->itemState; 
	//CRect rect;
	//rect.CopyRect(&lpDIS->rcItem); 

	m_state = NORMAL;

	if (state & ODS_FOCUS)
	{
		if (state & ODS_SELECTED)
		{ 
			m_state = DOWN;
		}
		else
		{
			if(m_bMouseOver)
				m_state = HOVER;
		}
	}
	else
	{
		m_state = NORMAL;
	}
	if (state & ODS_DISABLED)
	{
		m_state = DISABLE;
		m_bEnabled = false;
	}

	DrawButton();
}

void CSkinBtn::DrawButton()
{
	CClientDC  dc(this);

	CRect	rect;
	GetClientRect(&rect);

	CDC memDC;
	memDC.CreateCompatibleDC(&dc);

	CBitmap Screen;
	Screen.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
	memDC.SelectObject(&Screen);
	Screen.DeleteObject();

	//画背景 
	memDC.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &m_memDC, 0, 0, SRCCOPY);

	CString str;
	GetWindowText(str);	

	memDC.SetBkMode(TRANSPARENT);
	memDC.SelectObject(m_pFont);
	switch(m_state)
	{
	case NORMAL:
		
		//
		//memDC.TextOutW(m_textPos.x,m_textPos.y,str);
		if(!m_imgNormal.IsNull())
			m_imgNormal.TransparentBlt(memDC, rect.left, rect.top, 
				m_imgNormal.GetWidth(), m_imgNormal.GetHeight(), RGB(255,0,255));
		if(!m_hMouseOutIcon.IsNull())
		{
			m_hMouseOutIcon.TransparentBlt(memDC, m_iconRect.left,m_iconRect.top, 
				m_iconRect.Width(), m_iconRect.Height(), RGB(0,0,0));
			memDC.SetTextColor(GetFGColor());
			memDC.TextOutW(m_textPos.x,m_textPos.y,str);
		}
		//DrawButtonText(&dc, rect, str, GetFGColor());
		break;
	case HOVER:
		//DrawFilledRect(&memDC, rect, RGB(255,255,0));
		if(!m_imgHover.IsNull())
			m_imgHover.TransparentBlt(memDC, rect.left, rect.top, 
				m_imgHover.GetWidth(), m_imgHover.GetHeight(), RGB(255,0,255));
		if(!m_hMouseInIcon.IsNull())
		{
			m_hMouseInIcon.TransparentBlt(memDC, m_iconRect.left,m_iconRect.top, 
				m_iconRect.Width(), m_iconRect.Height(), RGB(0,0,0));
			memDC.SetTextColor(GetBGColor());
			memDC.TextOutW(m_textPos.x,m_textPos.y,str);
		}
  		//DrawButtonText(&dc, rect, str, GetFGColor());
		break;
	case DOWN:
		//DrawFilledRect(&memDC, rect, RGB(0,0,255)); 
		if(!m_imgDown.IsNull())
			m_imgDown.TransparentBlt(memDC, rect.left, rect.top, 
				m_imgDown.GetWidth(), m_imgHover.GetHeight(), RGB(255,0,255));
		if(!m_hMouseOutIcon.IsNull())
		{
			m_hMouseOutIcon.TransparentBlt(memDC, m_iconRect.left+1,m_iconRect.top+1, 
				m_iconRect.Width(), m_iconRect.Height(), RGB(0,0,0));
			memDC.SetTextColor(GetBGColor());
			memDC.TextOutW(m_textPos.x+1,m_textPos.y+1,str);
		}
		//DrawButtonText(&dc, rect, str, GetFGColor());
		break;
	case DISABLE:
		if(!m_imgDisable.IsNull())
			m_imgDisable.TransparentBlt(memDC, rect.left, rect.top, 
				m_imgDisable.GetWidth(), m_imgHover.GetHeight(), RGB(255,0,255));
		if(!m_hMouseOutIcon.IsNull())
		{
			m_hMouseOutIcon.TransparentBlt(memDC, m_iconRect.left,m_iconRect.top, 
				m_iconRect.Width(), m_iconRect.Height(), RGB(0,0,0));
			memDC.SetTextColor(GetFGColor());
			memDC.TextOutW(m_textPos.x,m_textPos.y,str);
		}
		//DrawButtonText(&dc, rect, str, RGB(128, 128, 128));
		break;
	default:
		break;
	}

	dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);

	memDC.DeleteDC();
}

void CSkinBtn::DrawFilledRect(CDC *DC, CRect R, COLORREF color)
{ 
	CBrush B;
	B.CreateSolidBrush(color);
	DC->FillRect(R, &B);
}

void CSkinBtn::DrawButtonText(CDC *DC, CRect R, CString str, COLORREF TextColor)
{
    COLORREF prevColor = DC->SetTextColor(TextColor);
	DC->SetBkMode(TRANSPARENT);
	DC->SelectObject(m_pFont);
	if(m_hMouseOutIcon.IsNull()&&m_hMouseInIcon.IsNull())
	{
		//int iconwidth=::GetSystemMetrics(SM_CXICON);
		R.right=R.right-m_textPos.x;
		DC->DrawText( str, str.GetLength(), R, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
	}
	else
	{
		DC->DrawText( str, str.GetLength(), R, DT_RIGHT|DT_VCENTER|DT_SINGLELINE);
	}
	DC->SetTextColor(prevColor);
}

void CSkinBtn::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	//if (nFlags & MK_LBUTTON && m_bMouseOver == FALSE) 
	//	return;
	if(!m_bMouseOver&&m_bEnabled)
	{
		m_bMouseOver=true;
		m_state = HOVER;

		CPoint	point;
		CRect	rect;
		GetWindowRect(&rect);	
		GetCursorPos(&point);
		if (!rect.PtInRect(point) && m_bMouseOver&&m_bEnabled)
		{
			SetTimer(1,10,NULL);
			return;
		}

		DrawButton();
		
		SetTimer(1,10,NULL);
	}
	CButton::OnMouseMove(nFlags, point);
}

void CSkinBtn::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CPoint	point;
	CRect	rect;
	GetWindowRect(&rect);	
	GetCursorPos(&point);

	if (!rect.PtInRect(point) && m_bMouseOver&&m_bEnabled)
	{
		KillTimer (1);
		m_bMouseOver=false;
		m_state = NORMAL;
		DrawButton();
	}

	CButton::OnTimer(nIDEvent);
}

void CSkinBtn::PreSubclassWindow()
{
	// TODO: 在此添加专用代码和/或调用基类
	SetOwnerDraw(true);

	CButton::PreSubclassWindow();
}

void CSkinBtn::SetOwnerDraw(bool IsDraw)
{
	if(IsDraw)
	{
		ModifyStyle(NULL, BS_OWNERDRAW); 
		Invalidate();
	}
	else
	{
		ModifyStyle(BS_OWNERDRAW, NULL); 
		Invalidate();
	}
}

void CSkinBtn::SetImage(CString strNormal, CString strHover, CString strDown, CString strDisable)
{
	m_imgNormal.Load(strNormal);
	m_imgHover.Load(strHover);
	m_imgDown.Load(strDown);
	m_imgDisable.Load(strDisable);
}

void CSkinBtn::SetImage(UINT nNormalID, UINT nHoverID, UINT nDownID, UINT nDisableID)
{
	m_imgNormal.LoadFromResource(AfxGetApp()->m_hInstance, nNormalID ); 
	m_imgHover.LoadFromResource(AfxGetApp()->m_hInstance, nHoverID ); 
	m_imgDown.LoadFromResource(AfxGetApp()->m_hInstance, nDownID ); 
	m_imgDisable.LoadFromResource(::GetModuleHandle(NULL), nDisableID ); 
}

BOOL CSkinBtn::OnEraseBkgnd(CDC* pDC)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if(!m_bDCStored)
	{
    	CRect  rect;
	    GetClientRect(&rect);

		m_memDC.CreateCompatibleDC (pDC);
		CBitmap	btScreen;
		btScreen.CreateCompatibleBitmap (pDC,rect.Width(),rect.Height());
		m_memDC.SelectObject (&btScreen);

		m_memDC.BitBlt (0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY);

		m_bDCStored=true;

		CRgn rgn;
		rgn.CreateRectRgn (0, 0, rect.Width(), rect.Height());
		SetWindowRgn (rgn, TRUE);

		btScreen.DeleteObject();
	}
	return TRUE;// CButton::OnEraseBkgnd(pDC);//
}

BOOL CSkinBtn::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_HAND)); 
	return TRUE;
	return CButton::OnSetCursor(pWnd, nHitTest, message);
}

void CSkinBtn::SetIcon(CString  strMouseOut,CString strMouseIn)
{
	m_hMouseOutIcon.Load(strMouseOut);
	m_hMouseInIcon.Load(strMouseIn);
}

void CSkinBtn::SetColor(COLORREF fgcolor,COLORREF bgcolor)
{
	m_fg = fgcolor;
	m_bg = bgcolor;
	DrawButton();
}

void CSkinBtn::SetTextPos(CPoint point)
{
	m_textPos = point;
	DrawButton();
}
CRect CSkinBtn::GetRectInParent()
{
	CRect rcWindowParent;
	GetParent()->GetWindowRect(rcWindowParent);//client
	CRect rcWindow;
	GetWindowRect(&rcWindow);
	CRect rect;
	rect.left = rcWindow.left-rcWindowParent.left;
	rect.top = rcWindow.top-rcWindowParent.top;
	rect.right = rcWindow.right-rcWindowParent.left;
	rect.bottom = rcWindow.bottom-rcWindowParent.top;

	return rect;
}
void CSkinBtn::OnEnable(BOOL bEnable)
{
	CButton::OnEnable(bEnable);

	// TODO: 在此处添加消息处理程序代码
	if(bEnable)
		m_bEnabled = true;
	else
		m_bEnabled = false;
}